//DFS实现拓扑排序
#include <iostream>
#include <cstring>
using namespace std;

const int N = 100010;

int h[N], e[N], ne[N], idx = 0; //模拟邻接表
int stk[N], top = -1;           //模拟栈
int d[N];                       //用来存储每个点的入度
int n, m, a, b;                 //获取输入
int q[N], cnt = 0;              //用来存储拓扑序列

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
    d[b]++; //点b的入度增加
    return;
}

bool topsort() //对有向图进行拓扑排序
{
    for (int i = 1; i <= n; ++i)
        if (!d[i])          //找到所有读入为0的点
            stk[++top] = i; //进栈
    while (top != -1)       //只要栈不空就继续循环
    {
        int t = stk[top--];                    //栈顶元素出栈
        q[cnt++] = t;                          //出栈的元素全部加入拓扑序列
        for (int i = h[t]; i != -1; i = ne[i]) //遍历此元素的所有可达点
        {
            int j = e[i];       //将这些点取出
            if (--d[j] == 0)    //如果除去本点后j点就没有入度了
                stk[++top] = j; //那么就将这点入栈
        }
    }
    return cnt == n; //如果拓扑序列里面包括了所有的数，那么个序列一定是拓扑序列
}

int main()
{
    freopen("cin.txt", "r", stdin);
    memset(h, -1, sizeof h);
    memset(d, 0, sizeof d);
    cin >> n >> m;
    while (m--)
    {
        cin >> a >> b;
        add(a, b);
    }
    if (topsort())
        for (int i = 0; i < cnt; ++i)
            cout << q[i] << " ";
    else
        cout << -1;
    return 0;
}